<html>
<head>
<title>CpcPaChi - Version 0.03</title>
<style type="text/css">
span {
	font-family: 'Courier New';
	font-size: 10pt;
	color: #000000;
}
.sc0 {
	color: #808080;
}
.sc3 {
	color: #008080;
}
.sc4 {
	color: #FF8000;
}
.sc5 {
	font-weight: bold;
	color: #0000FF;
}
.sc7 {
	color: #808080;
}
.sc9 {
	color: #804000;
}
.sc10 {
	font-weight: bold;
	color: #000080;
}
.sc11 {
}
</style>
</head>
<body>
<h2>Un compilador sencillo paso a paso (3)</h2>

<p align="right">(Volver al <a href="doc.html">&iacute;ndice</a>) </p>

<h3>Primer analizador l&eacute;xico</h3>





<p>Este tercer acercamiento va a incluir un primer analizador l&eacute;xico, que se encargue de extraer la informaci&oacute;n que le pidamos del fichero de entrada.</p>



<p>La intenci&oacute;n es tener funciones como "obtenerIdentificador" o como "obtenerEntero", que simplifiquen el an&aacute;lisis del programa fuente.</p>



<p>Por ejemplo, el an&aacute;lisis de "LOCATE", que debe estar seguido por un par&eacute;ntesis abierto, un n&uacute;mero entero, una coma, otro n&uacute;mero entero y un par&eacute;ntesis cerrado, antes era totalmente artesanal:</p>



<p><pre class="csharp csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">/* Descompongo, separando por la coma */</span> 
<span style="color: #FF0000;">int</span> ultimaPosicion <span style="color: #008000;">=</span> orden.<span style="color: #0000FF;">IndexOf</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;)&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span>;
<span style="color: #FF0000;">string</span> bloqueCifras <span style="color: #008000;">=</span> orden.<span style="color: #0000FF;">Substring</span><span style="color: #000000;">&#40;</span> <span style="color: #FF0000;">7</span>, ultimaPosicion<span style="color: #008000;">-</span><span style="color: #FF0000;">6</span> <span style="color: #000000;">&#41;</span>;
<span style="color: #FF0000;">char</span> <span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> delimitadores <span style="color: #008000;">=</span> <span style="color: #000000;">&#123;</span><span style="color: #666666;">','</span><span style="color: #000000;">&#125;</span>;
<span style="color: #FF0000;">string</span> <span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> cifras <span style="color: #008000;">=</span> bloqueCifras.<span style="color: #0000FF;">Split</span><span style="color: #000000;">&#40;</span>delimitadores<span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #008080; font-style: italic;">/* La primera cifra (1 o 2 letras) es X */</span> 
<span style="color: #FF0000;">int</span> x <span style="color: #008000;">=</span> Convert.<span style="color: #0000FF;">ToInt32</span><span style="color: #000000;">&#40;</span> cifras<span style="color: #000000;">&#91;</span>0<span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#41;</span>;
<span style="color: #008080; font-style: italic;">// ...</span></pre></p>

<p>y ahora ser&aacute; algo mucho m&aacute;s legible, m&aacute;s &quot;natural&quot;:</p>



<pre class="csharp csharp" style="font-family:monospace;">&nbsp;
miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">'('</span><span style="color: #000000;">&#41;</span>;
x <span style="color: #008000;">=</span> miLexer.<span style="color: #0000FF;">ObtenerEntero</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">','</span><span style="color: #000000;">&#41;</span>;
y <span style="color: #008000;">=</span> miLexer.<span style="color: #0000FF;">ObtenerEntero</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">')'</span><span style="color: #000000;">&#41;</span>;
&nbsp;</pre><pre>

leerSimbolo('(');

val(obtenerEntero,x,codError);

leerSimbolo(',');

val(obtenerEntero,y,codError);

leerSimbolo(')');

</pre>





<p>Las posibilidades de nuestro analizador l&eacute;xico son pocas por ahora, pero suficientes para lo que necesitamos en este momento:</p>



<ul>

  <li>Una funci&oacute;n "obtenerLetra", que devuelve una letra (un "char") del fichero de entrada. Internamente se lee de linea en linea: cada letra se toma de la l&iacute;nea actual, o se pide una nueva l&iacute;nea si no quedan m&aacute;s letras en la actual.</li>

  <li>Una funci&oacute;n "obtenerIdentificador", que devuelve una cadena ("string") formada por un conjunto de letras de la A a la Z (en "el mundo real" se suelen permitir tambi&eacute;n cifras num&eacute;ricas dentro de un identificador, pero a nosotros nos basta as&iacute; por ahora).</li>

  <li>Una funci&oacute;n "obtenerEntero", que devuelve un n&uacute;mero entero, como cadena ("string") formada por un conjunto de cifras del 0 al 9.</li>

  <li>Una funci&oacute;n "leerSimbolo", que intenta leer un cierto s&iacute;mbolo desde la entrada, y sale con un mensaje de error si no lo encuentra. Es nuestra primera ayuda para el an&aacute;lisis sint&aacute;ctico, del que hablaremos pronto: ciertos s&iacute;mbolos deben aparecer en un cierto orden (por ejemplo, despu&eacute;s de LOCATE debe hacer un par&eacute;ntesis abierto, un n&uacute;mero entero, una coma...) y esta funci&oacute;n nos servir&aacute; para comprobar que es as&iacute;.</li>

</ul>



<p><br />El c&oacute;digo fuente de este primer analizador l&eacute;xico ser&aacute;</p>



<p><pre class="csharp csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">/* cpcPaChi;
&nbsp;
   Un compilador de Pascal chiquitito para CPC
   Por Nacho Cabanes - Version 0.03cs (en C#)
&nbsp;
   uPachiL - unidad &quot;Lexer&quot; (analizador lexico)
&nbsp;
   Versiones hasta la fecha:
&nbsp;
   Num.   Fecha       Cambios
   ---------------------------------------------------
   0.03cs  22-Oct-2010  Primera version del analizador lexico:
                        es capaz de devolver un identificador,
                        un entero y de comprobar si el siguiente
                        simbolo es uno prefijado;
                        lee linea a linea del fichero de entrada   
*/</span> 
&nbsp;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.IO</span>;
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Lexer
<span style="color: #000000;">&#123;</span> 
  StreamReader ficheroOrigen;
  <span style="color: #FF0000;">string</span> lineaActual<span style="color: #008000;">=</span><span style="color: #666666;">&quot;&quot;</span>;
  <span style="color: #FF0000;">int</span> posicionLineaActual <span style="color: #008000;">=</span> 0;
  <span style="color: #FF0000;">bool</span> finFicheroEntrada <span style="color: #008000;">=</span> false;
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Constructor: abre el fichero de entrada */</span> 
  <span style="color: #0600FF;">public</span> Lexer<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> nombreFichero<span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    ficheroOrigen <span style="color: #008000;">=</span> File.<span style="color: #0000FF;">OpenText</span><span style="color: #000000;">&#40;</span>nombreFichero<span style="color: #000000;">&#41;</span>;
    leerLinea<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
  <span style="color: #000000;">&#125;</span> 
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Destructor: cierra el fichero de entrada */</span> 
  ~Lexer<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    ficheroOrigen.<span style="color: #0000FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
  <span style="color: #000000;">&#125;</span> 
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Lee una linea del fichero de entrada. Solo para uso interno del lexer */</span> 
  <span style="color: #0600FF;">void</span> leerLinea<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    lineaActual <span style="color: #008000;">=</span> ficheroOrigen.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>lineaActual <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> 
      finFicheroEntrada <span style="color: #008000;">=</span> true;
  <span style="color: #000000;">&#125;</span> 
&nbsp;
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Obtiene una letra del fichero. Se apoya en leerLinea: toma la
    siguiente letra de &quot;LineaDeEntrada&quot;, o lee otra linea del fichero
    si la actual ha terminado */</span> 
  <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">char</span> ObtenerLetra<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>posicionLineaActual <span style="color: #008000;">&gt;=</span> lineaActual.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
      leerLinea<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
      posicionLineaActual <span style="color: #008000;">=</span> 0;
      <span style="color: #0600FF;">return</span> <span style="color: #666666;">' '</span>;
    <span style="color: #000000;">&#125;</span> 
    <span style="color: #0600FF;">else</span> 
      <span style="color: #0600FF;">return</span> lineaActual<span style="color: #000000;">&#91;</span>posicionLineaActual <span style="color: #008000;">++</span><span style="color: #000000;">&#93;</span>;    
  <span style="color: #000000;">&#125;</span> 
&nbsp;
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Obtiene un identificador: devuelve una secuencia de letras */</span> 
  <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> ObtenerIdentificador<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>finFicheroEntrada<span style="color: #000000;">&#41;</span> 
      <span style="color: #0600FF;">return</span> null;
&nbsp;
    <span style="color: #FF0000;">string</span> lexema <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span>;
    <span style="color: #FF0000;">char</span> letra <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">+</span>ObtenerLetra<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToUpper</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#91;</span>0<span style="color: #000000;">&#93;</span>;  <span style="color: #008080; font-style: italic;">// (letra en mayusculas)</span> 
&nbsp;
    <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span>letra <span style="color: #008000;">&gt;=</span> <span style="color: #666666;">'A'</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #000000;">&#40;</span>letra <span style="color: #008000;">&lt;=</span> <span style="color: #666666;">'Z'</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
        lexema <span style="color: #008000;">+=</span> letra;
        letra <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">+</span>ObtenerLetra<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToUpper</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#91;</span>0<span style="color: #000000;">&#93;</span>;
    <span style="color: #000000;">&#125;</span> 
    <span style="color: #008080; font-style: italic;">// He leido uno de mas, asi que retrocedo</span> 
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>posicionLineaActual <span style="color: #008000;">&gt;</span> 0<span style="color: #000000;">&#41;</span> 
      posicionLineaActual --;
&nbsp;
    <span style="color: #0600FF;">return</span> lexema;
  <span style="color: #000000;">&#125;</span> 
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Obtiene un entero: devuelve una secuencia de cifras */</span> 
  <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> ObtenerEntero<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    <span style="color: #FF0000;">string</span> lexema <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span>;
    <span style="color: #FF0000;">char</span> letra <span style="color: #008000;">=</span> ObtenerLetra<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span>letra <span style="color: #008000;">&gt;=</span> <span style="color: #666666;">'0'</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #000000;">&#40;</span>letra <span style="color: #008000;">&lt;=</span> <span style="color: #666666;">'9'</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
        lexema <span style="color: #008000;">+=</span> letra;
        letra <span style="color: #008000;">=</span> ObtenerLetra<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span> 
    <span style="color: #008080; font-style: italic;">// He leido uno de mas, asi que retrocedo</span> 
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>posicionLineaActual <span style="color: #008000;">&gt;</span> 0<span style="color: #000000;">&#41;</span> 
      posicionLineaActual --;
&nbsp;
    <span style="color: #0600FF;">return</span> Convert.<span style="color: #0000FF;">ToInt32</span><span style="color: #000000;">&#40;</span> lexema <span style="color: #000000;">&#41;</span>;
  <span style="color: #000000;">&#125;</span> 
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Lee un símbolo del fichero de entrada y termina con
  un mensaje de error si encuentra otro distinto al que esperaba */</span> 
  <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> LeerSimbolo<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">char</span> simboloEsperado<span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    <span style="color: #FF0000;">char</span> letra;
&nbsp;
    letra <span style="color: #008000;">=</span> ObtenerLetra<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>letra <span style="color: #008000;">!=</span> simboloEsperado<span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
      Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span> 
        <span style="color: #666666;">&quot;Se esperaba{0} y se ha encontrado {1}&quot;</span>,
        simboloEsperado, letra<span style="color: #000000;">&#41;</span>;
      Environment.<span style="color: #0000FF;">Exit</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span> 
  <span style="color: #000000;">&#125;</span> 
<span style="color: #000000;">&#125;</span> 
&nbsp;</pre></p>

<p><br />Y el c&oacute;digo fuente del programa principal ser&aacute;:</p>



<p><pre class="csharp csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">/* cpcPaChi;
&nbsp;
   Un compilador de Pascal chiquitito para CPC
   Por Nacho Cabanes - Version 0.03cs (en C#)
&nbsp;
   Versiones hasta la fecha:
&nbsp;
   Num.   Fecha       Cambios
   ---------------------------------------------------
   0.03cs  22-Oct-2010  Creado un analizador lexico independiente
                        (en la clase &quot;Lexer&quot;)
&nbsp;
   0.02cs  18-Oct-2010  Admite CLS, LOCATE, WRITECHAR,
                        que lee desde fichero. Solo permite
                        una orden en cada linea, con formato fijo
&nbsp;
   0.01cs  15-Oct-2010  Preliminar: solo acepta CLS por teclado
                        y genera el codigo correspondiente
*/</span> 
&nbsp;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.IO</span>;
&nbsp;
<span style="color: #FF0000;">class</span> cpcpachi
<span style="color: #000000;">&#123;</span> 
  <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">string</span> nombreOrigen;
  <span style="color: #0600FF;">static</span> StreamWriter ficheroDestino;
  <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> lineaActual <span style="color: #008000;">=</span> <span style="color: #FF0000;">10</span>;
  <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> longitudTotal <span style="color: #008000;">=</span> 0;
  <span style="color: #0600FF;">static</span> Lexer miLexer;  <span style="color: #008080; font-style: italic;">// El analizador léxico</span> 
&nbsp;
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Analiza las opciones que teclee el usuario. Por ahora,
  solo el nombre del fichero a compilar */</span> 
  <span style="color: #0600FF;">public</span> cpcpachi<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
  <span style="color: #000000;">&#125;</span> 
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Analiza las opciones que teclee el usuario. Por ahora,
  solo el nombre del fichero a compilar */</span> 
  <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> analizarOpciones<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> opciones<span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>opciones.<span style="color: #0000FF;">Length</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
      Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span> 
        <span style="color: #666666;">&quot;No se ha indicado el nombre del fichero&quot;</span><span style="color: #000000;">&#41;</span>;
      Environment.<span style="color: #0000FF;">Exit</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span> 
&nbsp;
    nombreOrigen <span style="color: #008000;">=</span> opciones<span style="color: #000000;">&#91;</span>0<span style="color: #000000;">&#93;</span>;
    miLexer <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Lexer<span style="color: #000000;">&#40;</span>nombreOrigen<span style="color: #000000;">&#41;</span>;
    ficheroDestino <span style="color: #008000;">=</span> File.<span style="color: #0000FF;">CreateText</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;salida.bas&quot;</span><span style="color: #000000;">&#41;</span>;
  <span style="color: #000000;">&#125;</span> 
&nbsp;
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Analiza la orden que el usuario ha dado, y sale con un mensaje
  de error si es incorrecta */</span> 
  <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">string</span> analizarUnaOrden<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
&nbsp;
    <span style="color: #FF0000;">string</span> orden <span style="color: #008000;">=</span> miLexer.<span style="color: #0000FF;">ObtenerIdentificador</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>orden <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> 
      <span style="color: #0600FF;">return</span> null;
&nbsp;
    orden <span style="color: #008000;">=</span> orden.<span style="color: #0000FF;">ToUpper</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// No se distingue mayúsculas y minúsculas</span> 
&nbsp;
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span> orden <span style="color: #008000;">!=</span> <span style="color: #666666;">&quot;CLS&quot;</span> <span style="color: #000000;">&#41;</span> 
      <span style="color: #008000;">&amp;&amp;</span> <span style="color: #000000;">&#40;</span>orden.<span style="color: #0000FF;">IndexOf</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;LOCATE&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">!=</span>0 <span style="color: #000000;">&#41;</span> 
      <span style="color: #008000;">&amp;&amp;</span> <span style="color: #000000;">&#40;</span>orden.<span style="color: #0000FF;">IndexOf</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;WRITECHAR&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">!=</span>0 <span style="color: #000000;">&#41;</span> 
      <span style="color: #008000;">&amp;&amp;</span> <span style="color: #000000;">&#40;</span> orden <span style="color: #008000;">!=</span> <span style="color: #666666;">&quot;&quot;</span> <span style="color: #000000;">&#41;</span>    <span style="color: #008080; font-style: italic;">// Orden vacia: final de la orden anterior</span> 
      <span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
      Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span> 
        <span style="color: #666666;">&quot;Error: orden {0} no reconocida. Se esperaba: CLS, LOCATE o WRITECHAR&quot;</span>,
        orden<span style="color: #000000;">&#41;</span>;
      Environment.<span style="color: #0000FF;">Exit</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span> 
    <span style="color: #0600FF;">return</span> orden;
  <span style="color: #000000;">&#125;</span> 
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Genera el codigo de destino: codigo maquina de Amstrad CPC
  dentro de un cargador en Basic */</span> 
  <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> generarCodigoUnaOrden<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> orden<span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
&nbsp;
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span> orden.<span style="color: #0000FF;">ToUpper</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>  <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;CLS&quot;</span><span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
      ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span><span style="color: #666666;">&quot; DATA CD,6C,BB: ' CALL &amp;BB6C - CLS&quot;</span> <span style="color: #000000;">&#41;</span>;
      lineaActual <span style="color: #008000;">+=</span> <span style="color: #FF0000;">10</span>;
      longitudTotal <span style="color: #008000;">+=</span> <span style="color: #FF0000;">3</span>;
    <span style="color: #000000;">&#125;</span> 
&nbsp;
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span> orden.<span style="color: #0000FF;">ToUpper</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">IndexOf</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;WRITECHAR&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">==</span> 0 <span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
      <span style="color: #FF0000;">char</span> letra;
      miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">'('</span><span style="color: #000000;">&#41;</span>;
      miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">'<span style="color: #008080; font-weight: bold;">\'</span>'</span><span style="color: #000000;">&#41;</span>;
      letra <span style="color: #008000;">=</span> miLexer.<span style="color: #0000FF;">ObtenerLetra</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
      miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">'<span style="color: #008080; font-weight: bold;">\'</span>'</span><span style="color: #000000;">&#41;</span>;
      miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">')'</span><span style="color: #000000;">&#41;</span>;
      <span style="color: #FF0000;">byte</span> caracter <span style="color: #008000;">=</span> Convert.<span style="color: #0000FF;">ToByte</span><span style="color: #000000;">&#40;</span>letra<span style="color: #000000;">&#41;</span>;
      ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual
        <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; DATA 3E,&quot;</span> <span style="color: #008000;">+</span> Convert.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span>caracter,<span style="color: #FF0000;">16</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToUpper</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
        <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;: ' LD A, <span style="color: #008080; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #008000;">+</span> letra <span style="color: #008000;">+</span><span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #000000;">&#41;</span>;
      lineaActual <span style="color: #008000;">+=</span> <span style="color: #FF0000;">10</span>;
      ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span> 
        <span style="color: #666666;">&quot; DATA CD,5A,BB: ' CALL &amp;BB5A - WRITECHAR&quot;</span> <span style="color: #000000;">&#41;</span>;
      lineaActual <span style="color: #008000;">+=</span> <span style="color: #FF0000;">10</span>;
      longitudTotal <span style="color: #008000;">+=</span> <span style="color: #FF0000;">5</span>;
    <span style="color: #000000;">&#125;</span> 
&nbsp;
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span> orden.<span style="color: #0000FF;">ToUpper</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">IndexOf</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;LOCATE&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">==</span> 0 <span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
      <span style="color: #FF0000;">int</span> x, y;
      miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">'('</span><span style="color: #000000;">&#41;</span>;
      x <span style="color: #008000;">=</span> miLexer.<span style="color: #0000FF;">ObtenerEntero</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
      miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">','</span><span style="color: #000000;">&#41;</span>;
      y <span style="color: #008000;">=</span> miLexer.<span style="color: #0000FF;">ObtenerEntero</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
      miLexer.<span style="color: #0000FF;">LeerSimbolo</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">')'</span><span style="color: #000000;">&#41;</span>;
&nbsp;
      <span style="color: #008080; font-style: italic;">// Código para la columna</span> 
      ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual
        <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; DATA 3E,&quot;</span> <span style="color: #008000;">+</span> Convert.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span>x,<span style="color: #FF0000;">16</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToUpper</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
        <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;: ' LD A, &quot;</span> <span style="color: #008000;">+</span> x <span style="color: #000000;">&#41;</span>;
      lineaActual <span style="color: #008000;">+=</span> <span style="color: #FF0000;">10</span>;
      ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span> 
        <span style="color: #666666;">&quot; DATA CD,6F,BB: ' CALL &amp;BB6F - CURSOR COLUMN&quot;</span> <span style="color: #000000;">&#41;</span>;
      lineaActual <span style="color: #008000;">+=</span> <span style="color: #FF0000;">10</span>;
&nbsp;
      <span style="color: #008080; font-style: italic;">// Código para la fila</span> 
      ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual
        <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; DATA 3E,&quot;</span> <span style="color: #008000;">+</span> Convert.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span>y,<span style="color: #FF0000;">16</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToUpper</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
        <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;: ' LD A, &quot;</span> <span style="color: #008000;">+</span> y <span style="color: #000000;">&#41;</span>;
      lineaActual <span style="color: #008000;">+=</span> <span style="color: #FF0000;">10</span>;
      ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span> 
        <span style="color: #666666;">&quot; DATA CD,72,BB: ' CALL &amp;BB72 - CURSOR ROW&quot;</span> <span style="color: #000000;">&#41;</span>;
      lineaActual <span style="color: #008000;">+=</span> <span style="color: #FF0000;">10</span>;
&nbsp;
      longitudTotal <span style="color: #008000;">+=</span> <span style="color: #FF0000;">10</span>;
    <span style="color: #000000;">&#125;</span> 
&nbsp;
  <span style="color: #000000;">&#125;</span> 
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Genera el codigo de destino final: cargador Basic */</span> 
  <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> generarCodigoFinal<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span><span style="color: #666666;">&quot; DATA C9: ' RET&quot;</span> <span style="color: #000000;">&#41;</span>;
    ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span><span style="color: #FF0000;">10</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot; longitud = &quot;</span><span style="color: #008000;">+</span>longitudTotal <span style="color: #000000;">&#41;</span>;
    ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span><span style="color: #FF0000;">20</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot; MEMORY 39999&quot;</span> <span style="color: #000000;">&#41;</span>;
    ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span><span style="color: #FF0000;">30</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot; FOR n=40000 TO 40000+longitud&quot;</span> <span style="color: #000000;">&#41;</span>;
    ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span><span style="color: #FF0000;">40</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot; READ a$:POKE n,VAL(<span style="color: #008080; font-weight: bold;">\&quot;</span>&amp;<span style="color: #008080; font-weight: bold;">\&quot;</span>+a$)&quot;</span> <span style="color: #000000;">&#41;</span>;
    ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span><span style="color: #FF0000;">50</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot; NEXT&quot;</span> <span style="color: #000000;">&#41;</span>;
    ficheroDestino.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>lineaActual<span style="color: #008000;">+</span><span style="color: #FF0000;">60</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot; CALL 40000&quot;</span> <span style="color: #000000;">&#41;</span>;
    ficheroDestino.<span style="color: #0000FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
  <span style="color: #000000;">&#125;</span> 
&nbsp;
  <span style="color: #008080; font-style: italic;">/* Cuerpo del programa */</span> 
  <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> opciones<span style="color: #000000;">&#41;</span> 
  <span style="color: #000000;">&#123;</span> 
    <span style="color: #FF0000;">string</span> siguienteOrden;
    analizarOpciones<span style="color: #000000;">&#40;</span>opciones<span style="color: #000000;">&#41;</span>; 
&nbsp;
    siguienteOrden <span style="color: #008000;">=</span> analizarUnaOrden<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span>siguienteOrden <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> 
    <span style="color: #000000;">&#123;</span> 
      generarCodigoUnaOrden<span style="color: #000000;">&#40;</span> siguienteOrden <span style="color: #000000;">&#41;</span>;
      siguienteOrden <span style="color: #008000;">=</span> analizarUnaOrden<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span> 
    generarCodigoFinal<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
  <span style="color: #000000;">&#125;</span> 
<span style="color: #000000;">&#125;</span> 
&nbsp;</pre></p>


<p align="right">(Volver al <a href="doc.html">&iacute;ndice</a>) </p>
</body>
</html>
